package com.zhouyer.study.utils;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

/**
 * 处理静态资源相关的工具类
 *
 * @author zhouyao
 * @version 1.0
 * @date 2021/9/14 12:00 下午
 */
public class StaticResourceUtil {

    /**
     * 获取到静态资源文件的绝对路径
     *
     * @param path 静态资源文件的路径
     * @return java.lang.String
     * @author zhouyao
     * @date 2021/9/14 12:04 下午
     */
    public static String getAbsolutePath(String path) {
        // 获取到classpath路径
        String absolutePath = StaticResourceUtil.class.getResource("/").getPath();
        // windows/linux系统的文件分隔符进行统一
        return absolutePath.replaceAll("\\\\", "/") + path;
    }

    /**
     * 读取静态资源文件输入流，通过输出流输出
     *
     * @param inputStream  字节输入流
     * @param outputStream 字节输出流
     * @return void
     * @author zhouyao
     * @date 2021/9/14 12:07 下午
     */
    public static void outputStaticResource(InputStream inputStream, OutputStream outputStream) throws IOException {
        int count = 0;
        while (count == 0) {
            count = inputStream.available();
        }

        int resourceSize = count;
        // 输出http响应头，然后在输出具体内容
        outputStream.write(HttpProtocolUtil.getHttpHeader200(resourceSize).getBytes(StandardCharsets.UTF_8));

        // 读取静态资源内容
        // 保存已经读取的内容长度
        long written = 0;
        // 记录每次读取的字节长度，即缓冲长度
        int byteSize = 1024;
        byte[] bytes = new byte[byteSize];
        // 如果没有读取完，就继续读取
        while (written < resourceSize) {
            // 如果读取剩余的未读长度不足1024，那么就按真实长度读取，不然可能读取空
            if (resourceSize < written + byteSize) {
                byteSize = (int) (resourceSize - written);
                bytes = new byte[byteSize];
            }
            inputStream.read(bytes);
            outputStream.write(bytes);
            outputStream.flush();
            // 加上已读的长度
            written += byteSize;
        }
    }
}
